* (bug 5062) Width sometimes one pixel short when using maximum heights
authorBrion Vibber <brion@users.mediawiki.org>
Mon, 27 Feb 2006 08:38:57 +0000 (08:38 +0000)
committerBrion Vibber <brion@users.mediawiki.org>
Mon, 27 Feb 2006 08:38:57 +0000 (08:38 +0000)
RELEASE-NOTES
includes/Image.php
tests/ImageTest.php [new file with mode: 0644]
tests/RunTests.php

index 87f2b88..f1c2f63 100644 (file)
@@ -666,6 +666,7 @@ fully support the editing toolbar, but was found to be too confusing.
 * (bug 5086) Force image resize dimensions on ImageMagick, as for instance
   "-resize 100x35!"; some thumbs were off due to differences in rounding and
   would be generated smaller than expected.
+* (bug 5062) Width sometimes one pixel short when using maximum heights
 
 
 === Caveats ===
index 309a1d7..0afad68 100644 (file)
@@ -867,10 +867,7 @@ class Image
 
                if ($this->canRender()) {
                        if ( $width > $this->width * $height / $this->height )
-                               $width = floor( $this->width * $height / $this->height );
-                               # Note this is the largest width such that the thumbnail's
-                               # height is at most $height.
-
+                               $width = wfFitBoxWidth( $this->width, $this->height, $height );
                        $thumb = $this->renderThumb( $width );
                }
                else $thumb= NULL; #not a bitmap or renderable image, don't try.
@@ -1919,4 +1916,22 @@ class ThumbnailImage {
        }
 
 }
+
+/**
+ * Calculate the largest thumbnail width for a given original file size
+ * such that the thumbnail's height is at most $maxHeight.
+ * @param int $boxWidth
+ * @param int $boxHeight
+ * @param int $maxHeight
+ * @return int
+ */
+function wfFitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
+       $idealWidth = $boxWidth * $maxHeight / $boxHeight;
+       $roundedUp = ceil( $idealWidth );
+       if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight )
+               return floor( $idealWidth );
+       else
+               return $roundedUp;
+}
+
 ?>
diff --git a/tests/ImageTest.php b/tests/ImageTest.php
new file mode 100644 (file)
index 0000000..b06d4cb
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+require_once( 'PHPUnit.php' );
+require_once( '../includes/Defines.php' );
+require_once( '../includes/Profiling.php' );
+require_once( '../includes/GlobalFunctions.php' );
+require_once( '../includes/Image.php' );
+
+class ImageTest extends PHPUnit_TestCase {
+       function ImageTest( $name ) {
+               $this->PHPUnit_TestCase( $name );
+       }
+
+       function setUp() {
+       }
+
+       function tearDown() {
+       }
+       
+       function testFitBoxWidth() {
+               $vals = array(
+                       array(
+                               'width' => 50,
+                               'height' => 50,
+                               'tests' => array(
+                                       50 => 50,
+                                       17 => 17,
+                                       18 => 18 ) ),
+                       array(
+                               'width' => 366,
+                               'height' => 300,
+                               'tests' => array(
+                                       50 => 61,
+                                       17 => 21,
+                                       18 => 22 ) ),
+                       array(
+                               'width' => 300,
+                               'height' => 366,
+                               'tests' => array(
+                                       50 => 41,
+                                       17 => 14,
+                                       18 => 15 ) ),
+                       array(
+                               'width' => 100,
+                               'height' => 400,
+                               'tests' => array(
+                                       50 => 12,
+                                       17 => 4,
+                                       18 => 4 ) ) );
+               foreach( $vals as $row ) {
+                       extract( $row );
+                       foreach( $tests as $max => $expected ) {
+                               $y = round( $expected * $height / $width );
+                               $result = wfFitBoxWidth( $width, $height, $max );
+                               $y2 = round( $result * $height / $width );
+                               $this->assertEquals( $expected,
+                                       $result,
+                                       "($width, $height, $max) wanted: {$expected}x$y, got: {$result}x$y2" );
+                       }
+               }
+       }
+
+       /* TODO: many more! */
+}
+
+?>
\ No newline at end of file
index 4e6e641..e3486ef 100644 (file)
@@ -35,8 +35,15 @@ $tests = array(
        'SearchMySQL4Test',
        'ArticleTest',
        'SanitizerTest',
-       'CtypeTest'
+       'CtypeTest',
+       'ImageTest'
        );
+
+if( isset( $_SERVER['argv'][1] ) ) {
+       // to override...
+       $tests = array( $_SERVER['argv'][1] );
+}
+
 foreach( $tests as $test ) {
        require_once( $test . '.php' );
        $suite = new PHPUnit_TestSuite( $test );